//usealgo.cpp -- using several STL elements
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <iterator>
#include <algorithm>
#include <cctype>
using namespace std;

char toLower(char ch) {return tolower(ch);}
string & ToLower(string & st);
void display(const string &s);
int main()
{
	vector<string> words;
	cout<<"enter words(quit to quit)";
	string input;
	while(cin>>input&&input!="quit")
		words.push_back(input);

	cout<<"you entered the following words";
	for_each(words.begin(),words.end(),display);
	cout<<endl;

	//place words in set,converting to lowercase
	set<string> wordset;//set类型自动排序，自动除重.
	transform(words.begin(), words.end(),insert_iterator<set<string> >(wordset,wordset.begin()),ToLower);
	cout<<"\nAlphabetic list of words:\n";
	for_each(wordset.begin(),wordset.end(),display);
	cout<<endl;

	//place word and frequency in map
	map<string,int> wordmap;
	set<string>::iterator si;
	for(si=wordset.begin();si!=wordset.end();si++)
		wordmap[*si]=count(words.begin(),words.end(),*si);

	//display map contents
	cout<<"\nWord frequency:\n";
	for(si=wordset.begin();si!=wordset.end();si++)
		cout<<*si<<":"<<wordmap[*si]<<endl;
	return 0;
}
string &ToLower(string &st)
{
	transform(st.begin(),st.end(),st.begin(),toLower);
	return st;
}

void display(const string &s)
{
	cout<<s<<" ";
}
